//
// Copyright (c) 2019-2023 BPer
//

#ifndef INCLUDE_BPERJSON_BPERJSON_H_
#define INCLUDE_BPERJSON_BPERJSON_H_
#include <bperutil/BPerType.h>

typedef struct BPerJson
{
    struct BPerJson *next;
    struct BPerJson *prev;
    struct BPerJson *child;

    int type;
    char *valuestring;
    int valueint;
    double valuedouble;
    char *string;
    uint8_t* outString;
} BPerJson;


typedef struct{
	BPerJson* session;
	int (*getArraySize)(const BPerJson *array);
	BPerJson * (*getArrayItem)(const BPerJson *array, int index);
	BPerJson * (*getObjectItem)(const BPerJson * const object, const char * const string);
	BPerJson * (*getObjectItemCaseSensitive)(const BPerJson * const object, const char * const string);
	BPerBool (*hasObjectItem)(const BPerJson *object, const char *string);
	const char * (*getErrorPtr)(void);



	char * (*getStringValue)(const BPerJson * const item);
	double (*getNumberValue)(const BPerJson * const item);


	BPerBool (*isInvalid)(const BPerJson * const item);
	BPerBool (*isFalse)(const BPerJson * const item);
	BPerBool (*isTrue)(const BPerJson * const item);
	BPerBool (*isBool)(const BPerJson * const item);
	BPerBool (*isNull)(const BPerJson * const item);
	BPerBool (*isNumber)(const BPerJson * const item);
	BPerBool (*isString)(const BPerJson * const item);
	BPerBool (*isArray)(const BPerJson * const item);
	BPerBool (*isObject)(const BPerJson * const item);
	BPerBool (*isRaw)(const BPerJson * const item);
}BPerJsonReader;

typedef struct{
	BPerJson* session;
	BPerJson * (*createNull)(void);
	BPerJson * (*createTrue)(void);
	BPerJson * (*createFalse)(void);
	BPerJson * (*createBool)(BPerBool boolean);
	BPerJson * (*createNumber)(double num);
	BPerJson *  (*createString)(const char *string);

	BPerJson* (*createRaw)(const char *raw);
	BPerJson* (*createArray)(void);
	BPerJson* (*createObject)(void);

	BPerJson* (*addNullToObject)(BPerJson * const object, const char * const name);
	BPerJson* (*addTrueToObject)(BPerJson * const object, const char * const name);
	BPerJson* (*addFalseToObject)(BPerJson * const object, const char * const name);
	BPerJson* (*addBoolToObject)(BPerJson * const object, const char * const name, const BPerBool boolean);
	BPerJson* (*addNumberToObject)(BPerJson * const object, const char * const name, const double number);
	BPerJson* (*addStringToObject)(BPerJson * const object, const char * const name, const char * const string);
	BPerJson* (*addRawToObject)(BPerJson * const object, const char * const name, const char * const raw);
	BPerJson* (*addObjectToObject)(BPerJson * const object, const char * const name);
	BPerJson* (*addArrayToObject)(BPerJson * const object, const char * const name);

	char * (*print)(BPerJson *item);
	char * (*printUnformatted)(BPerJson *item);
	char * (*printBuffered)(BPerJson *item, int prebuffer, BPerBool fmt);

	//void (*free)(void *object);
}BPerJsonWriter;



#ifdef __cplusplus
extern "C"{
#endif

int32_t bPer_create_jsonReader(BPerJsonReader* reader,char* jsonStr);
void bPer_destroy_jsonReader(BPerJsonReader* reader);

int32_t bPer_create_jsonWriter(BPerJsonWriter* writer);
void bPer_destroy_jsonWriter(BPerJsonWriter* writer);



#ifdef __cplusplus
}
#endif
#endif /* INCLUDE_BPERJSON_BPERJSON_H_ */
